Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

553
Views
AOT no puede resolver todos los parámetros [...]

En primer lugar, debo decir que mi aplicación funciona bien cuando "usa" JIT. Incluso puedo agrupar en producción (sin AOT, solo JIT) y funciona bien.

Pero cuando trato de compilarlo (AOT) usando ngc , aparece un error que dice:

 Can't resolve all parameters for MyComponentView in /path/my-component/my-component.view.ts: ([object Object], [object Object], [object Object], [object Object], ?)

Este es el constructor de MyComponent :

 constructor( headerService:HeaderService, sidebarService:SidebarService, @Inject( AuthService.Token ) authService:AuthService.Class, router:Router, carbon:Carbon ) { … this.carbon = carbon; … }

La última dependencia (Carbon) se proporciona en AppModule de esta manera:

 @NgModule( { imports: [ … ], declarations: [ … ], providers: [ … CARBON_PROVIDERS, //<---- HERE IS BEING PROVIDED CARBON_SERVICES_PROVIDERS, … ], bootstrap: [ AppComponent ], } ) export class AppModule { }

Los CARBON_PROVIDERS se importan mediante el proyecto angular2-carbonldp que los exporta de esta manera:

 export const CARBON_PROVIDERS:any[] = [ { provide: Carbon, useFactory(): Context { return carbon; }, }, { provide: ContextToken, useFactory(): Context { return activeContextFn(); }, }, { provide: App.Context, useFactory(): App.Context { if( ! activeContextFn.isAppContext() ) throw new Errors.IllegalStateError( "The activeContext is not an App Context" ); return <any>activeContextFn(); }, }, ];

¡Pero termino teniendo el mismo error y no entiendo POR QUÉ! ¿Ustedes saben por qué funciona así?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Porque el compilador AOT admite solo un pequeño subconjunto de JavaScript. Este hecho está pobremente documentado, donde documentado en absoluto, y no ha sido ampliamente publicitado.

No puede analizar muchas expresiones de JavaScript dentro de los decoradores de marco Angular 2. Esto incluye llamadas a funciones que no son legales.

El siguiente código causa falla

 useFactory(): Context { return activeContextFn(); }

La razón de esto es que los decoradores angular2 bajo AOT no son decoradores en absoluto.

El compilador Angular 2 AOT mantiene una lista de decoradores conocidos que no persiste en el tiempo de ejecución, sino que los trata como nada más que anotaciones*. Esto significa que solo pueden contener expresiones constantes, referencias a nombres exportados, algunas formas de sintaxis literal de matriz y sintaxis literal de objeto que se componen de expresiones constantes, y poco más.

En caso de que se lo pregunte, sí, esto significa que ya no está escribiendo código TypeScript y, por lo tanto, ya no está escribiendo código JavaScript. Por cierto, también significa que no puede confiar en la mayoría de sus herramientas, ya que le darán luz verde para el código no válido porque no conocen el idioma.

Es un lenguaje diferente con semántica diferente y no simplemente un subconjunto porque la transformación del decorador que realiza viola la especificación para esa función en ECMAScript. Typescript no agrega ni modifica ningún comportamiento de tiempo de ejecución de ECMAScript.

* Como referencia, el término anotación se usa aquí en relación con el ahora muerto en el lenguaje @Script. Este es el lenguaje que el equipo de Angular inventó para escribir su marco y comenzó a usarlo mucho, a través de un transpilador dedicado, antes de pasar a TypeScript.

En este caso específico, creo que debe volver a escribir su fábrica de la siguiente manera:

 useFactory: contextFactory .... export function contextFactory() { return activeContextFn(); }

Es posible que esto no sea todo lo que necesita hacer y el idioma sin duda cambiará con el tiempo. Está programado para tener soporte IDE.

Aquí hay un "sandbox" bastante útil https://github.com/rangle/angular-2-aot-sandbox

Tenga en cuenta que el repositorio vinculado anteriormente no es una fuente oficial de documentación y que define su propio subconjunto en función de sus capacidades. Utilizar con precaución.

over 4 years ago · Santiago Trujillo Report

0

Para cualquier otra persona que busque este texto de error específico:

Encontré este error al crear un proyecto angular principal con AOT habilitado que tenía un proyecto de biblioteca angular secundario que había empaquetado con ng-packagr, que usaba barriles internamente. Pude resolver el problema cambiando todas las referencias de barril en el proyecto de biblioteca a referencias explícitas.

Antes

 import { MyService } from './featureFolder';

Después

 import { MyService } from './featureFolder/my.service';

Enlace de problema El equipo de desarrollo afirma que esto se solucionó, pero parece haber vuelto de alguna forma en Angular 8. https://github.com/angular/angular/issues/23713

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!